CCF最優灌溉(模板題)
阿新 • • 發佈:2018-11-22
第一種是prim演算法
但是有點坑
#include<iostream> using namespace std; typedef long long ll; ll arc[1010][1010]; const ll inf=0x3f3f3f3f; int n,e; ll prim() { ll dist[1010]; ll curent; ll sum=0; int i,j,k; dist[1]=0; for(i=2;i<=n;i++) { dist[i]=arc[1][i]; } for(i=0;i<n-1;i++) { curent=inf; for(j=2;j<=n;j++) { if(dist[j]!=0&&dist[j]<curent) { curent=dist[j]; k=j; } } sum+=curent; dist[k]=0; for(j=2;j<=n;j++) { if(dist[j]!=0&&dist[j]>arc[k][j]) dist[j]=arc[k][j]; } } return sum; } int main() { cin>>n>>e; int i,j; int a,b,c; for(i=1;i<=n;i++) for(j=1;j<=n;j++) arc[i][j]=inf; for(i=0;i<e;i++) { cin>>a>>b>>c; arc[a][b]=c; arc[b][a]=c; } cout<<prim()<<endl; return 0; } 2U 2018/8/15 11:54:51
你以為這樣就對了?
還是太年起了吧!
其實應該是題目給的條件有問題
它說ci>=1的
其實不然 測試資料中ci其實是有可能為0的
所以說 dist被走過了就要賦值為-1 而不是0哦哦!!!!!
#include<iostream> using namespace std; typedef long long ll; ll arc[1010][1010]; const ll inf=0x3f3f3f3f; int n,e; ll prim() { ll dist[1010]; ll curent; ll sum=0; int i,j,k; dist[1]=-1; for(i=2;i<=n;i++) { dist[i]=arc[1][i]; } for(i=0;i<n-1;i++) { curent=inf; for(j=2;j<=n;j++) { if(dist[j]!=-1&&dist[j]<curent) { curent=dist[j]; k=j; } } sum+=curent; dist[k]=-1; for(j=2;j<=n;j++) { if(dist[j]!=-1&&dist[j]>arc[k][j]) dist[j]=arc[k][j]; } } return sum; } int main() { cin>>n>>e; int i,j; int a,b,c; for(i=1;i<=n;i++) for(j=1;j<=n;j++) arc[i][j]=inf; for(i=0;i<e;i++) { cin>>a>>b>>c; arc[a][b]=c; arc[b][a]=c; } cout<<prim()<<endl; return 0; } 2U 2018/8/15 11:54:51
第二種就是Dijkstra演算法
可以用一個優先佇列
#include<iostream> #include<queue> using namespace std; int n,e; struct Node { int from; int to; int w; friend bool operator <(Node a,Node b) { return a.w>b.w; } }; priority_queue<Node> q; int parent[1010]; int findroot(int x) { if(parent[x]==-1) return x; else return findroot(parent[x]); } int change(int from,int to) { int x,y; x=findroot(from); y=findroot(to); if(x!=y) { parent[x]=y; return 1; } else return 0; } int Dijkstra() { Node t; int sum=0; int number=0; while(1) { if(number==n-1) break; t=q.top(); q.pop(); int from,to; from=t.from; to=t.to; if(change(from,to)) { sum+=t.w; number++; } } return sum; } int main() { cin>>n>>e; int i; int a,b,c; Node t; for(i=0;i<e;i++) { cin>>a>>b>>c; t.from=a; t.to=b; t.w=c; q.push(t); } for(i=1;i<=n;i++) parent[i]=-1; cout<<Dijkstra()<<endl; return 0; }
雖然是模板題還是要小心呀!