Battle over Cities
Time Limit : 10000/5000ms (Java/Other) Memory Limit : 65536/65536K (Java/Other)
Total Submission(s) : 4 Accepted Submission(s) : 0
Font: Times New Roman | Verdana | Georgia
Font Size: ← →
Problem Description
Given the map of cities which have all the destroyed and remaining highways marked, you are supposed to tell the cost to connect other cities if each city is conquered by the enemy.
Input
Note: It is guaranteed that the whole country was connected before the war and there is no duplicated high ways between any two cities.
Output
Sample Input
3 4 5 1 2 1 1 1 3 1 1 2 3 1 0 2 4 1 1 3 4 2 0 4 5 1 2 1 1 1 3 1 1 2 3 1 0 2 4 1 1 3 4 1 0 3 2 1 2 1 1 1 3 1 1
Sample Output
1 2 0 0 1 1 0 0 inf 0 0
Author
Source
#include<iostream>
#include<stdio.h>
#include<algorithm>
#define MAXN 20001
using namespace std;
int city,load;
int i,j;
struct edge
{
int u;
int v;
int cost;
int destory;
}edges[MAXN];
int parent[MAXN];
void UFset()
{
for(j=1;j<=city;j++)
{
parent[j]=-1;
}
}
int Find(int x)
{
int s;
for(s=x;parent[s]>=0;s=parent[s]);
while(s!=x)
{
int tmp=parent[x];
parent[x]=s;
x=tmp;
}
return s;
}
void Union(int R1,int R2)
{
int r1=Find(R1);
int r2=Find(R2);
int tmp=parent[r1]+parent[r2];
if(parent[r1]>parent[r2])
{
parent[r1]=r2;
parent[r2]=tmp;
}
else
{
parent[r2]=r1;
parent[r1]=tmp;
}
}
int cmp(const void*a,const void*b)
{
edge aa=*(const edge*)a;
edge bb=*(const edge*)b;
return aa.cost-bb.cost;
}
void Kruskal(int t)
{
int sumweight=0;
int num=0;
int u,v;
UFset();
for(j=0;j<load;j++)
{
u=edges[j].u;
v=edges[j].v;
if(u==t || v==t)
continue;
if(Find(u)!=Find(v))
{
sumweight+=edges[j].cost;
num++;
Union(u,v);
}
// if(num>=city-1)
// break;
}
if(num==city-2)
printf("%d\n",sumweight);
else
printf("inf\n");
}
int main()
{
int n;
int u,v,cost,destory;
scanf("%d",&n);
for(i=1;i<=n;i++)
{
scanf("%d%d",&city,&load);
for(j=0;j<load;j++)
{
scanf("%d%d%d%d",&u,&v,&cost,&destory);
edges[j].u=u;
edges[j].v=v;
if(destory==1)
edges[j].cost=0;
else
edges[j].cost=cost;
}
qsort(edges,load,sizeof(edges[0]),cmp);
int t;
for(t=1;t<=city;t++)
{
Kruskal(t);
}
}
return 0;
}