Time Limit: 3000MS | Memory Limit: 30000K | |
Total Submissions: 26442 | Accepted: 7044 |
Description
Input
Output
Sample Input
1 3 3 1 2 3 1 3 4 2 3 5
Sample Output
Scenario #1: 4
题意:求结点1到结点n的所有每个路径中的最长边中的最小值。
/* dijkstra Accepted 4316 KB 391 ms */ #include"cstdio" #include"cstring" #include"algorithm" using namespace std; const int MAXN=1002; const int INF=0x3fffffff; int mp[MAXN][MAXN]; int V,E; int dijkstra(int s) { int vis[MAXN]; memset(vis,0,sizeof(vis)); int d[MAXN];//代表最大承载量 for(int i=1;i<=V;i++) d[i]=mp[s][i]; int n=V; while(n--) { int maxcost,k; maxcost=0; for(int i=1;i<=V;i++) { if(!vis[i]&&d[i]>maxcost) { k=i; maxcost=d[i]; } } vis[k]=1; for(int i=1;i<=V;i++) { if(!vis[i]&&d[i]<min(d[k],mp[k][i])) { d[i]=min(d[k],mp[k][i]); } } } return d[V]; } int main() { int T; scanf("%d",&T); for(int cas=1;cas<=T;cas++) { memset(mp,0,sizeof(mp)); scanf("%d%d",&V,&E); for(int i=0;i<E;i++) { int u,v,cost; scanf("%d%d%d",&u,&v,&cost); mp[u][v]=mp[v][u]=cost; } printf("Scenario #%d:\n",cas); printf("%d\n\n",dijkstra(1)); } return 0; }
/* floyd Time Limit Exceeded */ #include"cstdio" #include"algorithm" using namespace std; const int MAXN=1002; const int INF=0x3fffffff; int mp[MAXN][MAXN]; int main() { int T; scanf("%d",&T); for(int cas=1;cas<=T;cas++) { int V,E; scanf("%d%d",&V,&E); for(int i=1;i<=V;i++) for(int j=1;j<=V;j++) if(i==j) mp[i][j]=0; else mp[i][j]=INF; for(int i=0;i<E;i++) { int u,v,cost; scanf("%d%d%d",&u,&v,&cost); mp[u][v]=mp[v][u]=cost; } for(int k=1;k<=V;k++) for(int i=1;i<=V;i++) for(int j=1;j<=V;j++) if(mp[i][k]<mp[i][j]&&mp[k][j]<mp[i][j]) mp[i][j]=max(mp[i][k],mp[k][j]); printf("Scenario #%d:\n",cas); printf("%d\n\n",mp[1][V]); } return 0; }
/* 堆优化dijkstra 1797 Accepted 5224K 329MS */ #include"cstdio" #include"queue" #include"vector" #include"algorithm" #include"cstring" using namespace std; const int MAXN=1002; const int INF=0x3fffffff; struct Edge{ int to,cost; Edge(int to,int cost) { this->to=to; this->cost=cost; } friend bool operator<(const Edge &a,const Edge &b) { return a.cost < b.cost; } }; int V,E; vector<int> G[MAXN]; int mp[MAXN][MAXN]; int dijkstra(int s) { int d[MAXN]; priority_queue<Edge> que; for(int i=1;i<=V;i++) { que.push(Edge(i,mp[s][i])); d[i]=mp[s][i]; } while(!que.empty()) { Edge e=que.top();que.pop(); if(e.to==V) return e.cost; int v=e.to; if(d[v]>e.cost) continue; for(int i=0;i<G[v].size();i++) { int u=G[v][i]; if(d[u]<min(d[v],mp[v][u])) { d[u]=min(d[v],mp[v][u]); que.push(Edge(u,d[u])); } } } return -1; } int main() { int T; scanf("%d",&T); for(int cas=1;cas<=T;cas++) { memset(mp,0,sizeof(mp)); scanf("%d%d",&V,&E); for(int i=1;i<=V;i++) { G[i].clear(); } for(int i=0;i<E;i++) { int u,v,cost; scanf("%d%d%d",&u,&v,&cost); G[u].push_back(v); G[v].push_back(u); mp[u][v]=mp[v][u]=cost; } printf("Scenario #%d:\n",cas); printf("%d\n\n",dijkstra(1)); } return 0; }
原文:http://www.cnblogs.com/program-ccc/p/5146914.html