Codeforces 107A. Dorm Water Supply 搜图
有m条边,n个点,每个点都至多有一个入水口和一个出水口,要求找到所有的水塔以及路径中最短的边。
#include <iostream> #include <cstring> using namespace std; struct ANS{ int u; int v; int d; }ans[1111]; int cnt; int n,m; int next[1111]={0}; int cost[1111]={0}; int pre[1111]={0}; bool v[1111]={0}; void dfs(int i); void dfs(int i,int flow) { v[i]=true; if (next[i]==0) { ans[cnt].d=flow; ans[cnt].v=i; return; } int j=next[i]; if (cost[j]<flow&&cost[j]!=0) { dfs(j,cost[j]); } else { dfs(j,flow); } } int main() { cnt=0; cin>>n>>m; for (int i=1;i<=m;i++) { int a,b,k; cin>>a>>b>>k; next[a]=b; pre[b]=a; cost[a]=k; } for (int i=1;i<=n;i++) { if (!v[i]&&pre[i]==0&&next[i]!=0) { ans[cnt].u=i; dfs(i,cost[i]); cnt++; } } cout<<cnt<<endl; for (int i=0;i<cnt;i++) { cout<<ans[i].u<<" "<<ans[i].v<<" "<<ans[i].d<<endl; } return 0; }