标签:
//zjnu 1410
//floyed
#include<cstdio> #include<iostream> #include<algorithm> #include<cstring> using namespace std; #define inf 0x3fffffff int mp[201][201],n; void floyed() { int i,j,k,mi=inf; for(i=0;i<n;i++) { for(j=0;j<n;j++) { if(mp[j][i]!=inf) { for(k=0;k<n;k++) { mp[j][k]=min(mp[j][k],mp[j][i]+mp[i][k]); } } } } } int main() { int m,a,b,c,s,t; int i,j; while(~scanf("%d%d",&n,&m)) { for(i=0;i<n;i++) { for(j=0;j<n;j++) { if(i==j)mp[i][j]=0; else mp[i][j]=mp[j][i]=inf; } } while(m--) { scanf("%d%d%d",&a,&b,&c); if(mp[a][b]>c) mp[a][b]=mp[b][a]=c; } scanf("%d%d",&s,&t); floyed(); if(mp[s][t]==inf)printf("-1\n"); else printf("%d\n",mp[s][t]); } }
//Dijkstra #include<cstdio> #define maxsum 0x7FFFFFFF int map[101][101],dist[101],s[101]; //map记录路线图,dist最短距离,s记录点 void Dijkstra(int n,int x) { int mindis,u; for(int i=1;i<=n;i++) { dist[i]=map[x][i]; s[i]=0; } s[x]=1; for(int j=1;j<=n;j++) { if(!s[j]&&dist[j]<mindis) { u=j; mindis=dist[j]; } } s[u]=1; for(int j=1;j<=n;j++) { if(!s[j]&&dist[u]+map[u][j]<dist[j]&&map[u][j]<maxsum) { dist[j]=dist[u]+map[u][j]; } } } int main() { int n,m,a,b,c; while(~scanf("%d%d",&n,&m)) { if(n==0&&m==0)break; for(int i=1;i<=n;i++) { for(int j=i;j<n;j++) map[i][j]=map[j][i]=maxsum;//初始化数组map } for(int i=1;i<=m;i++) { scanf("%d%d%d",&a,&b,&c); map[a][b]=map[b][a]=c; } Dijkstra(n,1); printf("%d\n",dist[n]); } return 0; }
//hdu 3790 #include<cstdio> #include<iostream> #include<algorithm> #include<cstring> using namespace std; #define maxsum 0x7FFFFFFF int n; struct node{ int mon,len; }mp[1001][1001],dis[1001]; bool s[1001]; void Dijkstra(int x) { int u,minlen,minmon; for(int i=1;i<=n;i++) { dis[i].len=mp[x][i].len;//距离 dis[i].mon=mp[x][i].mon;//花费 s[i]=0; } s[x]=1; for(int i=1;i<=n;i++) { u=-1; minlen=maxsum; minmon=maxsum; for(int j=1;j<=n;j++) { if(!s[j]) { if(minlen>dis[j].len) { minlen=dis[j].len; minmon=dis[j].mon; u=j; } else if(minlen==dis[j].len&&minmon>dis[j].mon) { minmon=dis[j].mon; u=j; } } } s[u]=1; for(int j=1;j<=n;j++) { if(u==-1)break; else if(!s[j]) { if(dis[j].len>dis[u].len+mp[u][j].len&&mp[u][j].len<maxsum) { dis[j].len=dis[u].len+mp[u][j].len; dis[j].mon=dis[u].mon+mp[u][j].mon; } if(dis[j].len==dis[u].len+mp[u][j].len&&mp[u][j].len<maxsum&&mp[u][j].mon<maxsum&&dis[j].mon>dis[u].mon+mp[u][j].mon) dis[j].mon=dis[u].mon+mp[u][j].mon; } } } } int main() { int m,x,y; int a,b,c,d; while(~scanf("%d%d",&n,&m)) { if(n==0&&m==0)break; for(int i=1;i<=n;i++) for(int j=1;j<=n;j++) { if(i==j)mp[i][j].len=mp[i][j].mon=0; else { mp[i][j].len=mp[j][i].len=maxsum; mp[i][j].mon=mp[j][i].mon=maxsum; } } while(m--) { scanf("%d%d%d%d",&a,&b,&c,&d); if(c<mp[a][b].len)//处理重边情况 { mp[a][b].len=mp[b][a].len=c; mp[a][b].mon=mp[b][a].mon=d; } else if(c==mp[a][b].len&&d<mp[a][b].mon) { mp[a][b].mon=mp[b][a].mon=d; } } scanf("%d%d",&x,&y); memset(dis,0,sizeof(dis)); Dijkstra(x); printf("%d %d\n",dis[y].len,dis[y].mon); } return 0; }
//图的建立与遍历 #include<cstdio> #include<iostream> #include<algorithm> #include<cstring> #include<queue>; using namespace std; int n,m,vis[105],e[105][105]; void dfs(int v) { vis[v]=1; printf("%d ",v); for(int w=0;w<n;w++) { if(w==v)continue; if(e[v][w]&&!vis[w]) dfs(w); } } void bfs(int v) { queue<int>q; q.push(v); vis[v]=1; while(!q.empty()) { int tmp=q.front(); q.pop(); printf("%d ",tmp); for(int w=0;w<n;w++) { if(w==tmp)continue; if(e[tmp][w]&&!vis[w]) { q.push(w); vis[w]=1; } } }_ } int main() { int a,b; while(~scanf("%d%d",&n,&m)) { memset(e,0,sizeof(e)); while(m--) { scanf("%d%d",&a,&b); e[a][b]=e[b][a]=1; } memset(vis,0,sizeof(vis)); for(int i=0;i<n;i++) if(!vis[i]) dfs(i); printf("\n"); memset(vis,0,sizeof(vis)); for(int i=0;i<n;i++) if(!vis[i]) bfs(i); printf("\n\n"); } }
//差分系统 void relax(int u,int v,int weight)//松弛计算 { if(dis[v]>dis[u]+weight) dis[v]=dis[u]+weight; } bool Bellman_Ford() { for(int i=1;i<=nodenum-1;i++) for(int j=1;j<=edgenum;j++) relax(edge[j].u,edge[j].v,edge[j].weight) bool flag=1; for(int i=1;i<=edgenum;i++) if(dis[edge[i].v]>dis[edge[i].u]+edge[i].weight) { flag=0; break; } return flag; }
标签:
原文地址:http://www.cnblogs.com/Agatha/p/4709078.html