已经好久没写代码了,看到这个题目,模板题目,太水了。马上找个模板套上去,交了。(不过套模板,真是坏习惯......)
代码如下:
#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <vector>
#include <queue>
using namespace std;
const int MAXN = 202;
int c[MAXN][MAXN];
int dis[MAXN];
vector<int> v[MAXN];
int start, end;
const int OO = 0x7fffffff;
void init()
{
memset(c, 0, sizeof (c));
for (int i = 0; i < MAXN; i++) {
v[i].clear();
}
}
bool BFS() {
memset(dis, 0, sizeof (dis));
queue<int> q;
q.push(start);
dis[start] = 1;
int pos;
while (!q.empty()) {
pos = q.front();
q.pop();
int size = v[pos].size();
for (int i = 0; i < size; i++) {
int next = v[pos][i];
if (dis[next] == 0 && c[pos][next] > 0) {
dis[next] = dis[pos] + 1;
q.push(next);
}
}
}
return (dis[end] > 0);
}
int find(int u, int min_flow) {
if (dis[u] >= dis[end]) return (u == end) ? min_flow : 0;
int size = v[u].size();
for (int i = 0; i < size; i++)
{
int next = v[u][i];
int a;
if (dis[next] == dis[u] + 1 && c[u][next] > 0 && (a = find(next, min(min_flow, c[u][next]))))
{
c[u][next] -= a;
c[next][u] += a;
return a;
}
}
return 0;
}
bool cmp( const tt a, const tt b )
{
return a.a < b.a;
}
int get_result()
{
int tans, i , j , k, p, sum = 0 ;
int res = 0;
while (BFS())
{
while (tans = find(start, OO))
res += tans;
}
return res;
}
int main()
{
int N, M;
int Si, Ei, Ci, ca, w, ans, tmp ;
cin >> ca;
for ( w = 1 ; w <= ca; w++ )
{
printf( "Case #%d:\n", w);
scanf("%d%d", &N, &M);
init();
start = 1, end = N; ans = 0;
for (int i = 0; i < M; i++)
{
scanf("%d%d%d", &Si, &Ei, &Ci);
v[Si].push_back(Ei);
v[Ei].push_back(Si);
c[Si][Ei] += Ci;
c[Ei][Si] += Ci;
tmp = get_result();
if ( tmp>0 )
{
printf( "%d %d\n", i+1, tmp);
}
}
}
return 0;
}