Online Judge | Problem Set | Authors | Online Contests | User | ||||||
---|---|---|---|---|---|---|---|---|---|---|
Web Board Home Page F.A.Qs Statistical Charts | Current Contest Past Contests Scheduled Contests Award Contest |
多种方法,dijkstra(建图技巧),spfa(简单思维判断)//方法1:spfa版本 Memory: 768K Time: 32MS #include<iostream> #include<cstdio> #include<cstring> #include<algorithm> #include<vector> #include<queue> using namespace std; #define MAXN 605 #define INF 0x3f3f3f3f int colour[MAXN]; int dis[MAXN]; int vis[MAXN]; int map[MAXN][MAXN]; struct node { int to,w; node(){} node(int to,int w):to(to),w(w){} }; vector<node>edges[MAXN]; void init(int n) { for(int i=0;i<=n;i++) { vis[i]=0; colour[i]=0; dis[i]=INF; for(int j=0;j<=n;j++) { map[i][j]=0; } edges[i].clear(); } } void add(int u,int v,int w) { edges[u].push_back(node(v,w)); } int spfa(int s,int t) { queue<int>que; que.push(s); vis[s]=1; dis[s]=0; while(!que.empty()) { int u=que.front(); que.pop(); vis[u]=0; int len=edges[u].size(); for(int i=0;i<len;i++) { int v=edges[u][i].to; int w=edges[u][i].w; if(dis[v]>=dis[u]+w) { dis[v]=dis[u]+w; if(!vis[v]) { vis[v]=1; que.push(v); } } } } return dis[t]; } int main() { int n,m; while(scanf("%d",&n)!=EOF&&n) { scanf("%d",&m); init(n); for(int i=1;i<=m;i++) { int a,b,c; scanf("%d%d%d",&a,&b,&c); if(a>b)swap(a,b); map[a][b]=c; } for(int i=1;i<=n;i++) { int a; scanf("%d",&a); colour[i]=a; } for(int i=1;i<=n;i++) { for(int j=i+1;j<=n;j++) { if(map[i][j]) { if(colour[i]==colour[j]) { add(i,j,map[i][j]); add(j,i,map[i][j]); } else { if(colour[i]==colour[1]) { add(i,j,map[i][j]); } else { add(j,i,map[i][j]); } } } } } int ans=spfa(1,2); if(ans==INF) { printf("-1\n"); } else { printf("%d\n",ans); } } return 0; } //dijkstra版本 Memory:572K Time: 16MS #include<iostream> #include<cstdio> #include<cstring> #include<algorithm> #include<vector> #include<queue> using namespace std; #define MAXN 605 #define INF 0x3f3f3f3f int colour[MAXN]; int dis[MAXN]; int vis[MAXN]; int map[MAXN][MAXN]; int n,m; void init() { for(int i=0;i<=n;i++) { vis[i]=0; colour[i]=0; for(int j=0;j<=n;j++) { if(i==j)map[i][j]=0; else map[i][j]=INF; } } } int dijkstra(int s,int t) { for(int i=1;i<=n;i++) { dis[i]=map[s][i]; } dis[s]=0; vis[s]=1; for(int i=1;i<n;i++) { int MIN=INF; int k=0; for(int j=1;j<=n;j++) { if(!vis[j]&&dis[j]<MIN) { MIN=dis[j]; k=j; } } vis[k]=1; for(int j=1;j<=n;j++) { if(!vis[j]&&dis[j]>dis[k]+map[k][j]) { dis[j]=dis[k]+map[k][j]; } } } return dis[t]; } int main() { while(scanf("%d",&n)!=EOF&&n) { scanf("%d",&m); init(); for(int i=1;i<=m;i++) { int a,b,c; scanf("%d%d%d",&a,&b,&c); map[a][b]=map[b][a]=c; } for(int i=1;i<=n;i++) { int a; scanf("%d",&a); colour[i]=a; } for(int i=1;i<=n;i++) { for(int j=1;j<=n;j++) { if(map[i][j]) { if(colour[i]!=colour[j]) { if(colour[i]==colour[1]) { map[j][i]=INF; } else { map[i][j]=INF; } } } } } int ans=dijkstra(1,2); if(ans==INF) { printf("-1\n"); } else { printf("%d\n",ans); } } return 0; } //spfa(简单思维判断) Memory: 320K Time: 16MS #include<iostream> #include<cstdio> #include<cstring> #include<algorithm> #include<vector> #include<queue> using namespace std; #define MAXN 605 #define INF 0x3f3f3f3f int colour[MAXN]; int dis[MAXN]; int vis[MAXN]; struct node { int to,w; node(){} node(int to,int w):to(to),w(w){} }; vector<node>edges[MAXN]; struct link { int to; int cnt[2][2]; link(){} }; void init() { memset(colour,0,sizeof(colour)); for(int i=0;i<MAXN;i++) { edges[i].clear(); } } void add(int u,int v,int w) { edges[u].push_back(node(v,w)); edges[v].push_back(node(u,w)); } int spfa(int s,int t) { fill(dis,dis+MAXN,INF); memset(vis,0,sizeof(vis)); queue<link>que; link rt; rt.to=s; memset(rt.cnt,0,sizeof(rt.cnt)); rt.cnt[colour[s]][colour[s]]++; que.push(rt); vis[s]=1; dis[s]=0; while(!que.empty()) { link curr=que.front(); que.pop(); vis[curr.to]=0; int len=edges[curr.to].size(); for(int i=0;i<len;i++) { link next=curr; int v=edges[curr.to][i].to; int w=edges[curr.to][i].w; next.to=v; next.cnt[colour[curr.to]][colour[v]]++; next.cnt[colour[v]][colour[curr.to]]++; if(colour[s]==colour[t]) { if(colour[v]==colour[s]) { if(dis[v]>dis[curr.to]+w) { dis[v]=dis[curr.to]+w; if(!vis[v]) { vis[v]=1; que.push(next); } } } } else { if(next.cnt[colour[s]][colour[t]]<=1&&next.cnt[colour[t]][colour[s]]<=1) { if(dis[v]>dis[curr.to]+w) { dis[v]=dis[curr.to]+w; if(!vis[v]) { vis[v]=1; que.push(next); } } } } } } return dis[t]; } int main() { int n,m; while(scanf("%d",&n)!=EOF&&n) { scanf("%d",&m); init(); for(int i=1;i<=m;i++) { int a,b,c; scanf("%d%d%d",&a,&b,&c); add(a,b,c); } for(int i=1;i<=n;i++) { int a; scanf("%d",&a); colour[i]=a-1; } int ans=spfa(1,2); if(ans==INF) { printf("-1\n"); } else { printf("%d\n",ans); } } return 0; } Followed by: Post your reply here: |
All Rights Reserved 2003-2013 Ying Fuchen,Xu Pengcheng,Xie Di
Any problem, Please Contact Administrator