1.DFS版:
#include <stdio.h>
#include <string.h>
#include <algorithm>
#include <iostream>
#include <queue>
#define maxn 1010
#define inf 1<<29
using namespace std;
int n,m;
int cnt;
int flag;
struct node{
int u,v,cost,next;
void set(int _u,int _v,int _c,int _n){
u = _u; v = _v; cost = _c; next = _n;
}
} edge[maxn*3];
int head[maxn];
int vis[maxn];
int d[maxn];
void add(int u,int v,int cost){
edge[cnt].set(u, v, cost, head[u]);
head[u]=cnt++;
}
void spfa(int u) {
int v;
for (int i = head[u]; i != -1; i = edge[i].next) {
v = edge[i].v;
if (d[u] + edge[i].cost < d[v]) {
if (vis[v]) { //存在一点在一条路径上出现多次
flag = true;
return ;
}
else {
d[v] = d[u] + edge[i].cost;
vis[v] = true;
spfa(v);
}
}
}
}
int main(){
int t;
scanf("%d",&t);
while(t--){
scanf("%d%d",&n,&m);
memset(head,-1,sizeof(head));
memset(vis, 0, sizeof(vis));
fill(d, d+maxn, inf);
cnt=0;
for(int i=0; i<m; i++){
int a,b,c;
scanf("%d %d %d",&a,&b,&c);
add(a,b,c);
}
flag = 0;
d[0] = 0;
vis[0] = 1;
spfa(0);
// for(int i = 1;i <= n;i++)
// printf("%d ",d[i]);
printf("%s\n",flag?"possible":"not possible");
}
return 0;
}
2队列版(注意与BFS的区别):
#include <stdio.h>
#include <string.h>
#include <algorithm>
#include <iostream>
#include <queue>
#define maxn 1010
#define inf 1<<29
using namespace std;
int n,m;
int cnt;
struct node{
int u,v,cost,next;
void set(int _u,int _v,int _c,int _n){
u = _u; v = _v; cost = _c; next = _n;
}
} edge[maxn*3];
int head[maxn];
int vis[maxn];
int d[maxn];
int num[maxn];
void add(int u,int v,int cost){
edge[cnt].set(u, v, cost, head[u]);
head[u]=cnt++;
}
bool spfa(){
queue<int> q;
memset(num,0,sizeof(num));
d[0]=0;
vis[0]=1;
q.push(0);
num[0]++;
while(!q.empty()){
int u=q.front();
int i;
for(i=head[u]; i!=-1; i=edge[i].next){
int v=edge[i].v;
if(d[v]>d[u]+edge[i].cost){
d[v]=d[u]+edge[i].cost;
if(!vis[v]){
num[v]++;
vis[v]=1;
q.push(v);
if(num[v]>n-1)
return 1;
}
}
}
q.pop();
vis[u]=0;
}
return 0;
}
int main(){
//freopen("input.txt","r",stdin);
int t;
scanf("%d",&t);
while(t--){
scanf("%d %d",&n,&m);
memset(head,-1,sizeof(head));
memset(vis, 0, sizeof(vis));
fill(d, d+maxn, inf);
cnt=0;
for(int i=0; i<m; i++){
int a,b,c;
scanf("%d %d %d",&a,&b,&c);
add(a,b,c);
}
printf("%s\n",spfa()?"possible":"not possible");
}
return 0;
}