标签:
重要的事情说三遍kruskal不可能AC kruskal不可能AC kruskal不可能AC
如果你说你能AC,请把你的代码再交一遍试试(这题的数据可能加强过),再把代码发我,让我开开眼界
开始随意的写了个没优化的prim算法都TLE到死,临接矩阵可以飘过,加了堆优化可能好一点,心太累,已经AC了就不想改了
#include<iostream> #include<vector> #include<cstdio> #include<algorithm> #define maxn 505 #define inf 1<<20 using namespace std; int n; vector<int>mapp[maxn]; int vaule[maxn][maxn]; int visit[maxn]; void prim() { int d[maxn]; fill(d,d+1+n,inf); fill(visit,visit+1+n,0); int re=0,k=0; d[1]=0; while(1) { int v=-1; for(int i=1;i<=n;i++) { if(!visit[i]&&(v==-1||d[i]<d[v])) v=i; } //cout<<v<<"~"<<endl; if(v==-1||d[v]==inf) break; re+=d[v]; k++; if(k==n) break; visit[v]=1; for(int i=0;i<mapp[v].size();i++) { int x=mapp[v][i]; if(!visit[x]) d[x]=min(d[x],vaule[v][x]);//不加判断条件直接更新会TLE } } //cout<<k<<endl; if(k==n) cout<<re<<endl; else cout<<"-1"<<endl; } int main() { //cin.sync_with_stdio(false); int t; //cin>>t; scanf("%d",&t); while(t--) { for(int i=0;i<=n;i++) mapp[i].clear(); int m,k; scanf("%d%d%d",&n,&m,&k); for(int i=0;i<=n;i++) { for(int j=0;j<=n;j++) vaule[i][j]=inf; } for(int i=0;i<m;i++) { int x,y,z; scanf("%d%d%d",&x,&y,&z); if(vaule[x][y]==inf) { mapp[x].push_back(y); mapp[y].push_back(x); vaule[x][y]=min(vaule[x][y],z); vaule[y][x]=min(vaule[y][x],z); //cout<<vaule[x][y]<<endl; } else { vaule[x][y]=min(vaule[x][y],z); vaule[y][x]=min(vaule[y][x],z); } } for(int i=0;i<k;i++) { int s; scanf("%d",&s); int x; scanf("%d",&x); for(int j=0;j<s-1;j++) { int y; scanf("%d",&y); if(vaule[x][y]==inf) { mapp[x].push_back(y); mapp[y].push_back(x); vaule[x][y]=0; vaule[y][x]=0; } else { vaule[x][y]=0; vaule[y][x]=0; } } } prim(); } return 0; }
版权声明:本文为博主原创文章,未经博主允许不得转载。
标签:
原文地址:http://blog.csdn.net/zafkiel_nightmare/article/details/47999449