看来模板又错了,敲你妈妈小饼干
#include<iostream>
#include<queue>
#include<cstring>
#include<cstdio>
#include<cmath>
#include<cstdlib>
#include<algorithm>
#include<stack>
#include<vector>
#include<map>
using namespace std;
const int inf = 0x3f3f3f3f ;
struct node {
int u,v,Flow,next;
};
node Li[3000];
int Head[110],top;
int vis[110],ans[110];
bool vis1[110],vis2[110];
int n,m,l;
int s,t;
void Add(int u,int v,int f) {
Li[top].v=v;
Li[top].u=u;
Li[top].Flow=f;
Li[top].next=Head[u];
Head[u]=top++;
}
bool BFS() {
memset(vis,-1,sizeof(vis));
vis[s]=0;
queue<int>q;
q.push(s);
while(!q.empty()) {
int u=q.front();
q.pop();
for(int i=Head[u]; i!=-1; i=Li[i].next) {
if(Li[i].Flow&&vis[Li[i].v]==-1) {
vis[Li[i].v]=vis[u]+1;/**为何要如此标记?改**/
q.push(Li[i].v);
}
}
}
return vis[t]!=-1;
}
int DFS(int u,int f) {
if(u==t) {
return f;
}
int ans=0;
for(int i=Head[u]; i!=-1; i=Li[i].next) {
if(Li[i].Flow&&vis[Li[i].v]==vis[u]+1) {
int d=DFS(Li[i].v,min(f,Li[i].Flow));
f-=d;
Li[i].Flow-=d;
Li[i^1].Flow+=d;//神奇呀!!!!!!
ans+=d;
}
}
return ans;
}
void dfs(int u,bool *vist,int op) {
vist[u]=true;
for(int i=Head[u]; i!=-1; i=Li[i].next) {
if(!vist[Li[i].v]&&Li[i^op].Flow!=0) {
dfs(Li[i].v,vist,op);
}
}
}
void Dinic() {
int ans;
while(BFS()) {
ans=DFS(s,inf);
}
}
int main() {
while(scanf("%d%d%d",&n,&m,&l)!=EOF&&n) {
s=n+m+1;
t=0;
memset(Head,-1,sizeof(Head));
int a,b,c;
top = 0;
for(int i=0; i<l; i++) {
scanf("%d%d%d",&a,&b,&c);
Add(a,b,c);
Add(b,a,0);
}
for(int i=1; i<=n; i++) {
Add(s,i,inf);
Add(i,s,0);
}
Dinic();
memset(vis1,0,sizeof(vis1));
memset(vis2,0,sizeof(vis2));
dfs(s,vis1,0);
dfs(t,vis2,1);
int num = 0;
for(int i=0; i<l; i++) {
if(Li[i<<1].Flow==0){
Li[i<<1].Flow=1;
if(BFS())ans[num++]=i+1;
Li[i<<1].Flow=0;
}
}
if(num) {
for(int i=0; i<num; i++) {
if(i) {
printf(" ");
}
printf("%d",ans[i]);
}
}
printf("\n");
}
}