水題MST吧。。對於這種模版題,我已經可以不用做了。。。。沖刺東北賽!!!!
Problem : 3371 ( Connect the Cities ) Judge Status : Accepted
RunId : 8394387 Language : C++ Author : CherryChou
Code Render Status : Rendered By HDOJ C++ Code Render Version 0.01 Beta
#include <cstdio>
#include <cstring>
#include <queue>
#include <vector>
#include <climits>
using namespace std;
const int maxn=2005 ;
const int maxm=4000005;
const int inf=INT_MAX;
typedef pair<int,int>node;
struct edge
{
int u,v,w,next;
}e[maxm];
struct cmp
{
bool operator()(const node &a,const node &b)const
{
return a.second>b.second;
}
};
int num,head[maxn];
int dis[maxn],vis[maxn];
priority_queue<node,vector<node>,cmp>q;
inline void add(int u,int v,int w)
{
e[num].u=u;
e[num].v=v;
e[num].w=w;
e[num].next=head[u];
head[u]=num++;
}
void addedge(int u,int v,int w)
{
add(u,v,w);
add(v,u,w);
}
int prime(int s)
{
int i,u,v,mincost=0;
dis[s]=0;
q.push(make_pair(s,0));
while(!q.empty())
{
node a=q.top();
q.pop();
u=a.first;
if(vis[u])
continue;
vis[u]=1;
mincost+=a.second;
for(i=head[u];i!=-1;i=e[i].next)
{
v=e[i].v;
if(!vis[v]&&e[i].w<dis[v])
{
dis[v]=e[i].w;
q.push(make_pair(v,e[i].w));
}
}
}
return mincost;
}
void init(int n)
{
num=0;
memset(head,-1,sizeof(head));
memset(vis,0,sizeof(vis));
for(int i=0;i<=n;i++)
{
dis[i]=inf;
vis[i]=0;
}
}
int main()
{
int T;
scanf("%d",&T);
while(T--)
{
int n,m,k,U,V,W,t,x,y;
scanf("%d%d%d",&n,&m,&k);
init(n);
for(int i=1;i<=m;i++)
{
scanf("%d%d%d",&U,&V,&W);
addedge(U,V,W);
}
while(k--)
{
scanf("%d",&t);
scanf("%d",&x);
for(int i=1;i<t;i++)
{
scanf("%d",&y);
addedge(x,y,0);
}
}
int ans=prime(1);
int flag=1;
for(int i=1;i<=n;i++)
{
if(vis[i]==0)
{
flag=0;
break;
}
}
if(flag)
printf("%d\n",ans);
else printf("-1\n");
}
return 0;
}