前向星存储结构
题为UVA-11183 Teen Girl Squad
#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<cmath>
#include<queue>
using namespace std;
typedef long long ll;
const int N=1e3+10;
const int M=4e4+10;
const int INF=0x7f7f7f7f;
struct Edge
{
int u,v,w;
}edge[M];
int pre[N],id[N],in[N],vis[N];
int zhuliu(int root,int n,int m)
{
int sum=0,u,v;
while(true)
{
for(int i=0;i<n;i++)
in[i]=INF;
for(int i=0;i<m;i++)
{
Edge e=edge[i];
if(e.u!=e.v&&e.w<in[e.v])
{
pre[e.v]=e.u;
in[e.v]=e.w;
}
}
for(int i=0;i<n;i++)
if(i!=root&&in[i]==INF)
return -1;
int tn=0; //环的个数
memset(id,-1,sizeof(id)); //环编号
memset(vis,-1,sizeof(vis));
in[root]=0;
for(int i=0;i<n;i++)
{
sum+=in[i];
v=i;
while(vis[v]!=i&&id[v]==-1&&v!=root)
{
vis[v]=i;
v=pre[v];
}
if(v!=root&&id[v]==-1)
{
for(int u=pre[v];u!=v;u=pre[u])
id[u]=tn;
id[v]=tn++;
}
}
if(tn==0) break;
for(int i=0;i<n;i++) //缩点
if(id[i]==-1)
id[i]=tn++;
for(int i=0;i<m;i++)
{
v=edge[i].v;
edge[i].u=id[edge[i].u];
edge[i].v=id[edge[i].v];
if(edge[i].u!=edge[i].v)
edge[i].w-=in[v];
}
n=tn;
root=id[root];
}
return sum;
}
int main()
{
int T,kase=0;
int n,m;
int a,b,c;
scanf("%d",&T);
while(T--)
{
scanf("%d%d",&n,&m);
for(int i=0;i<m;i++)
{
scanf("%d%d%d",&a,&b,&c);
edge[i].u=a;
edge[i].v=b;
edge[i].w=c;
}
int ans=zhuliu(0,n,m);
printf("Case #%d: ",++kase);
if(ans==-1) printf("Possums!\n");
else printf("%d\n",ans);
}
return 0;
}