题意:给你一个有向图,叫你求出每个环的最大边
分析:从边短的连接起来,如果长边的的两点,之前已经间接连接起来,则标记这条边。
#include <iostream>
#include <algorithm>
#include <bits/stdc++.h>
#include <vector>
#include <cstdio>
#define MAXN 2000
#define MAXM 30000
using namespace std;
struct Edge
{
int u,v,w;
bool operator <(const Edge& ee)
{
return w<ee.w;
}
}e[MAXM];
int cc,pre[MAXN],n,m;
bool vis[MAXM];
void add(int u,int v,int w)
{
e[cc]=(Edge){u,v,w};
cc++;
}
int finds(int x)
{
if(pre[x]==-1) return x;
return pre[x] = finds(pre[x]);
}
int main()
{
while(cin>>n>>m&&(n||m))
{
if(n==0||m==0)
{
cout << "forest" << endl;continue;
}
int u,v,w;
cc=0;
for(int i=0;i<m;i++)
{
cin>>u>>v>>w;
add(u,v,w);
}
sort(e,e+cc);
fill_n(pre,n+1,-1);
fill_n(vis,cc,false);
int fx,fy;
for(int i=0;i<cc;i++)
{
fx=finds(e[i].u);fy=finds(e[i].v);
if(fx!=fy)
{
pre[fx]=fy;
vis[i]=true;//printf("e[i].w = %d i = %d\n",e[i].w,i);
}
}
// printf("begining!\n");
vector<int> ans;
for(int i = 0; i < cc; i++)
{
if(!vis[i])
{
ans.push_back(e[i].w);
//printf("e[i].w = %d\n",e[i].w);
}
}
if(!ans.size())
{
printf("forest\n");
continue;
}
printf("%d", ans[0]);
for(unsigned int i=1; i<ans.size(); i++)
printf(" %d", ans[i]);
printf("\n");
}
return 0;
}