哎,好久没切题了,今天又来切题鸟,一定要坚持!!!至少每天一题!
这题本质就是判断图中有没有负环。我的第一反应就是用Bellman-ford算法解决,代码如下
#include <cstdio>
#include <queue>
#include <cstring>
using namespace std;
typedef pair<int,int> pii;
const int maxn = 1006;
const int INF = 0x2fffffff;
vector<pii> G[maxn];
int d[maxn];
int main()
{
int t,n,m;
int len_adj = -1;
bool tag_haveWormHole = false;
scanf("%d",&t);
for(int i = 1; i <= t; i++){
//pre process start
len_adj = -1;
tag_haveWormHole = false;
for(int j = 0; j < maxn; j++)
d[j] = INF;
d[0] = 0;
for(int j = 0; j < maxn; j++)
G[j].clear();
//pre process end
scanf("%d%d",&n,&m);
for(int j = 0; j < m; j++){//Build Adj Graph
int u,v,w;
scanf("%d%d%d",&u,&v,&w);
G[u].push_back(make_pair(v,w));
if(u > len_adj)
len_adj = u;
}
//Bellford-man-algorithm
for(int i1 = 1; i1 <= n - 1; i1++){
for(int j = 0; j <= len_adj; j++){//哎,len_adj因是adj的最大的下标不是大小!,在这坑了
for(int k = 0; k < G[j].size(); k++){
int u = j;
int v = G[j][k].first;
int w = G[j][k].second;
// printf("v = %d,u = %d, w = %d,d[v] = %d\n",v,u,w,d[v]);
if(d[v] > d[u] + w){
d[v] = d[u] + w;
// printf("d[%d] = %d ",v,d[v]);
}
}
}
// printf("#%d end\n",i1);
}
// puts("");
//output test
//for(int i1 = 0; i1 < 5 ;i1++)
// printf("d[%d] = %d ",i1,d[i1]);
// puts("");
//output test end
for(int j = 0; j < len_adj;j++){
for(int k = 0; k < G[j].size(); k++){
int u = j;
int v = G[j][k].first;
int w = G[j][k].second;
if(d[v] >d[u] + w){
tag_haveWormHole = true;
}
}
}
if(tag_haveWormHole)
puts("possible");
else
puts("not possible");
}
return 0;
}
2013 05 30
By ACReaper