此题路径为双向。。。在此处错了n次。。。。
#include<stdio.h> #include<iostream> #include<queue> #include<string.h> #define INF 0x3f3f3f3f using namespace std; int m,n,x,he[1100],vi[1100],pre[1100],dist[1100]; struct s { int ne,v,w,f; }st[40005]; void add(int ne,int v,int f,int w) { st[x].v=v;st[x].f=f;st[x].w=w; st[x].ne=he[ne];he[ne]=x++; st[x].v=ne;st[x].f=0;st[x].w=-w; st[x].ne=he[v];he[v]=x++; } queue<int> q; bool dfs(int qd,int t) { memset(vi,0,sizeof(vi)); memset(pre,-1,sizeof(pre)); int i; for(i=1;i<=m;i++) dist[i]=INF; dist[1]=0; while(!q.empty()) q.pop(); q.push(1); vi[1]=1; while(!q.empty()) { int fr=q.front(); q.pop(); vi[fr]=0; for(i=he[fr];i!=-1;i=st[i].ne) { int v=st[i].v; if(st[i].f>0&&dist[v]>dist[fr]+st[i].w) { dist[v]=dist[fr]+st[i].w; pre[v]=i; if(!vi[v]) { q.push(v); vi[v]=1; } } } } } void fy(int qd,int t) { int sum=0; for(int h=1;h<=2;h++) { dfs(qd,t); sum+=dist[m]; int k=pre[m]; while(k!=-1) { st[k].f--; st[k^1].f++;//chichu k=pre[st[k^1].v]; } } printf("%d\n",sum); } int main() { int a; int i,j,b; memset(he,-1,sizeof(he)); x=0; scanf("%d%d",&m,&n); for(int i=1;i<=n;i++) { int a,b,c; scanf("%d%d%d",&a,&b,&c); add(a,b,1,c); add(b,a,1,c);//注意这条边,,, } fy(1,m); return 0; }