http://acm.sdut.edu.cn/sdutoj/problem.php?action=showproblem&problemid=1866
4 4 1 4 2 4 100 1 2 1 3 1 100 4 3 1
2 2 4
#include"stdio.h" #include"string.h" #include"queue" #include"stack" #include"algorithm" #include"vector" #include"iostream" #include"math.h" #include"map" #include"stdlib.h" #define M 222 #define inf 100000000 using namespace std; struct node { int u,v,w,next; }edge[M*M]; int t,head[M],dis[M],dist[M][M],vis[M]; void init() { t=0; memset(head,-1,sizeof(head)); } void add(int u,int v,int w) { edge[t].u=u; edge[t].v=v; edge[t].w=w; edge[t].next=head[u]; head[u]=t++; edge[t].u=v; edge[t].v=u; edge[t].w=w; edge[t].next=head[v]; head[v]=t++; } int bfs(int S,int T) { queue<int>q; memset(dis,-1,sizeof(dis)); dis[S]=0; q.push(S); while(!q.empty()) { int u=q.front(); q.pop(); for(int i=head[u];i!=-1;i=edge[i].next) { int v=edge[i].v; if(edge[i].w&&dis[v]==-1) { dis[v]=dis[u]+1; if(v==T) return 1; q.push(v); } } } return 0; } int dfs(int cur,int a,int T) { if(cur==T)return a; for(int i=head[cur];i!=-1;i=edge[i].next) { int v=edge[i].v; if(edge[i].w&&dis[v]==dis[cur]+1) { int tt=dfs(v,min(edge[i].w,a),T); if(tt) { edge[i].w-=tt; edge[i^1].w+=tt; return tt; } } } return 0; } void Dinic(int S,int T) { int ans=0; while(bfs(S,T)) { while(int tt=dfs(S,inf,T)) ans+=tt; } } void floyd(int n) { int i,j,k; for(k=1;k<=n;k++) { for(i=1;i<=n;i++) { for(j=1;j<=n;j++) { if(dist[i][j]>dist[i][k]+dist[k][j]) dist[i][j]=dist[i][k]+dist[k][j]; } } } } int main() { int i,j,n,m,st,sd,a,b,c; while(scanf("%d%d%d%d",&n,&m,&st,&sd)!=-1) { init(); for(i=1;i<=m;i++) { scanf("%d%d%d",&a,&b,&c); add(a,b,c); } Dinic(st,sd); for(i=1;i<=n;i++) { for(j=1;j<=n;j++) { if(i==j)dist[i][j]=0; else dist[i][j]=inf; } } for(i=0;i<t;i++) { int u=edge[i].u; int v=edge[i].v; if(edge[i].w) dist[u][v]=edge[i].w; } floyd(n); int num=0; for(i=0;i<t;i+=2) { int u=edge[i].u; int v=edge[i].v; if(dist[u][v]<inf&&dist[v][u]<inf)continue; vis[num++]=i/2+1; } printf("%d\n",num); for(i=0;i<num;i++) printf("%d\n",vis[i]); return 0; } return 0; }