第一次做这样的题,第一次写着代码,不熟,几乎都是看别人的然后又写的,先贴两个代码吧!然后再自己消化!
bellman-ford
#include<iostream> #include<cstdio> #include<cstring> #include<climits> #include<algorithm> #include<queue> #include<stack> #include<vector> using namespace std; #define rep(i,n) for(int i=0;i<(n);i++) #define repf(i, a, b) for (int i=(a); i<=(b); ++i) #define repd(i, a, b) for (int i=(a); i>=(b); --i) #define exp 0.000000000001 #define N 10000000 typedef struct fun { int u,v,w; }rr; fun link[200000]; int n,m,sum; void bellmanford() { int i,j; int dis[2000]; for(i=0; i<=n; i++) dis[i]=999999999; for(i=1; i<n; i++) for(j=1; j<sum; j++) { if(dis[link[j].v]>dis[link[j].u]+link[j].w) dis[link[j].v]=dis[link[j].u]+link[j].w; } int sign=0; for(j=1; j<sum; j++) if(dis[link[j].v]>dis[link[j].u]+link[j].w) { sign=1; break; } if(sign==1) printf("Unreliable\n"); else printf("Reliable\n"); } int main() { char s; int u,v,i,w; while(scanf("%d%d",&n,&m)!=EOF) { sum=1; for(i=1; i<=m; i++) { getchar(); scanf("%c",&s); if(s=='P') { scanf("%d%d%d",&u,&v,&w); link[sum].u=u; link[sum].v=v; link[sum++].w=-w; link[sum].u=v; link[sum].v=u; link[sum++].w=w; } else { scanf("%d%d",&u,&v); link[sum].u=u; link[sum].v=v; link[sum++].w=-1; } } bellmanford(); } return 0; }
spfa:
/* 对于精确信息,可以得出两个差分条件,b-a = c;可以化为b <=a+c && a <= b-c; 对于模糊信息,只能得出一个差分条件,可以化为 b - a <= 1;所以a <= b-1;说明b到a有一条长度为-1的边 */ #include<iostream> #include<cstdio> #include<string> #include<cmath> #include<queue> using namespace std; #define min(a,b) (a)>(b)?(b):(a) typedef struct fun { int v,w; int pre; }rr; fun link[300000]; int len[1005]; int n,m,sum; void addpage(int u,int v,int w) { link[sum].v=v; link[sum].w=w; link[sum].pre=len[u]; len[u]=sum++; } void spfa() { bool vis[1005]; int cout[1005]; int i; int dis[1005]; queue<int>q; for(i=0; i<=n; i++) { cout[i]=0; vis[i]=false; dis[i]=INT_MAX; } q.push(0); vis[0]=true; dis[0]=0; cout[0]++; while(!q.empty()) { int k=q.front(); vis[k]=false; q.pop(); for(i=len[k];i>0; i=link[i].pre) { if(dis[link[i].v]>dis[k]+link[i].w) { dis[link[i].v]=dis[k]+link[i].w; if(vis[link[i].v]==false) { q.push(link[i].v); vis[link[i].v]=true; cout[link[i].v]++; if(cout[link[i].v]>n) { printf("Unreliable\n"); return ; } } } } } printf("Reliable\n"); } int main() { char s; int i,u,v,w; int sign; while(~scanf("%d%d",&n,&m)) { sum=1; for(i=0; i<=n; i++) len[i]=0; sign=0; for(i=1; i<=m; i++) { getchar(); scanf("%c",&s); if(s=='P') { scanf("%d%d%d",&u,&v,&w); addpage(u,v,-w); addpage(v,u,w); } else { scanf("%d%d",&u,&v); addpage(u,v,-1); // addpage(v,u,-1); } } for(i=0; i<=n; i++) addpage(0,i,0); if(sign==1) printf("Unreliable\n"); else spfa(); } return 0; }